-=( 7A69 E-zine 11 )=--=( art10 )=--=( Curiosidades del IRC )=--=( tuxisuau )=-

Curiosidades del IRC: Paseando por los RFCs
-------------------------------------------

Buenas, soy tuxisuau y me pueden encontrar en el IRC-hispano, en canales de 
tematica linuxera. Decidi escribir este articulo despues de haber tenido la 
necesidad de leerme los RFC's del IRC al querer programar ciertas cosas que 
usarian este protocolo :) y haber descubierto muchas cosas que desconocia.

En este texto voy a hablar siempre de comandos del protocolo IRC... A la hora 
de experimentar con estos comandos hay que recordar esto, puesto que si 
introducimos los comandos literalmente en clientes de irc (por cierto, 
recomiendo BitchX, lo podeis bajar en www.bitch.org) el que interpretara los 
comandos sera el cliente y este decidira lo que debe enviar al server, y esto 
no es lo que a nosotros nos interesa puesto que queremos pasar comandos 
literales al servidor.

Para ello, podemos usar distintos trucos...

- /quote (comando de muchos clientes para pasar datos directamente al server)
- /raw (substituto de /quote en algunos clientes)
- telnet (el mejor cliente que existe, no es precisamente el mas comodo...)

Vamos a por ello! :)

INDEX

1. Canales

1.1. Tipos de canal / Nombres
1.2. Modos de canal (extraido en plan bestia del RFC 2811)
1.2.1. Canales anonimos
1.2.2. Canales silenciosos
1.2.3. Server Reop
1.2.4 Canales con clave

2. Registro de conexion

2.1. Paso a paso...
2.1.1. PASS <password>
2.1.2. NICK <nickname>
2.1.3. USER <user> <mode> <unused> <realname>
2.1.4. OPER <name> <password>
2.1.5. MODE <nick> <modo>
2.2. Ejemplo de conexion

3. Chateando un poco

3.1. PRIVMSG <nickdestino> <texto>
3.2. NOTICE <nickdestino> <texto>
3.3. JOIN ( <canal> [password] ) / "0"
3.4. PART <canal> <partmsg>
3.5. QUIT <quitmsg>

4. CTCP: Client 2 Client Protocol

4.1. Enviando CTCP's
4.2. Tipos de CTCP
4.2.1. CLIENTINFO
4.2.2. ERRMSG
4.2.3. FINGER
4.2.4. USERINFO
4.2.5. VERSION
4.2.6. SOURCE

5. DCC: Conexiones directas entre clientes

5.1. Tipos de DCC
5.1.1. CHAT
5.1.2. SEND
5.2. Inicio de una conexion DCC
5.2.1. Pasando una IP a Integer
5.2.2. Debilidades de los DCC

6. Conclusion

---

1. Canales

1.1. Tipos de canal / Nombres

Los nombres de los canales son cadenas de como maximo 50 caracteres. Del 
nombre se excluyen los espacios, control-g (k pena), comas y dos puntos.

La primera letra es decisiva:

# --> Canal de toda la vida
& --> Canal local: solo existe en el servidor del user que lo crea
+ --> Canal sin modos: siempre es '+t' y no admite ningun otro modo
! --> Canal 'seguro': Permanece cuando esta vacio y recuerda su fundador (+O)

Los canales seguros deben crearse con join !canalseguro, el ! es substituido 
por una combinacion de 5 caracteres al azar por el server. El creador del 
canal se convierte en +O del canal (no confundir con +o), y aunque abandone el 
canal y entre otra vez vuelve a ser +O. Esto no tira en el hispano... si 
encontrais algun server en el k tire rulad un memo :)

1.2. Modos de canal (extraido en plan bestia del RFC 2811)

O - da status de "creador de canal" (!canales_seguros)
o - da privilegios de operador
v - da voz

a - canal anonimo (todos los users q hablan son anonymous!anonymous@anonymous)
i - invite-only (solo se puede entrar si te invitan antes)
m - canal moderado (solo hablan los k tienen voz o op)
n - no acepta mensajes desde el exterior del canal.
q - canal silencioso (no se envian parts/joins/cambios_nick a los users)
p - canal privado (no sale en listas de canales)
s - canal secreto (como el privado, pero ademas no sale en los whois)
r - server reop (!canales seguros, evita que el canal se quede sin ops)
t - topic (permite el canvio de topic unicamente a los op)

k - clave (ajusta/elimina el password del canal)
l - user-limit (limita el numero de users del canal)

b - ban (ajusta/elimina mascaras de ban para mantener users fuera)
e - excepcion (ajusta/elimina mascaras excepcion a los bans)
I - invite (ajusta/elimina mascaras excepcion al invite-only)

1.2.1. Canales anonimos

En estos canales, se oculta el nombre de los users bajo la mascara 
anonymous!anonymous@anonymous cuando estos hablan. En los canales !seguros 
solo debe ser ajustado por el +O (creador del canal) y debe ser irreversible.
Vale la pena advertir que la anonimicidad solo funciona a nivel 
server-cliente, no a nivel server-server.
(No rlz en el hispano)

1.2.2. Canales silenciosos

Para uso exclusivo de los servidores, suelen ser canales donde los servidores 
envian notices sobre sus operaciones. Desde el punto de vista de los usuarios, 
en estos canales estan 'solos' y se ocultan los 'mensajes' de join, part y 
canvios de nick. sirve para reemplazar el modo +s de forma mas eficiente para 
este tipo de canales.
(Quien sabe si rlz en el hispano o no...)

1.2.3. Server Reop

Exclusivo de los canales !seguros, sirve para evitar que un canal se quede sin 
ops durante un tiempo excesivo. Para ello da op a algunas personas al azar. Si 
el canal es pequeo (<6 personas) da op a todos los miembros si al menos 1 es 
local al servidor, o si tanto el channel delay (duracion de canal vacio) y el 
reop delay (retardo de server reop) se han agotado. En otros casos se da op al 
menos a un usuario. El mecanismo que se usa actualmente es buscar usuarios que 
lleven poco tiempo 'idle'.

1.2.4 Canales con clave

Son vulnerables a sniffing... las claves se envian en texto plano.

2. Registro de conexion

Puedes experimentar con telnet :)

Normalmente durante el proceso de conexion hay intercambio de pings/pongs, por 
lo que es lo primero que explicare:

Si recibes: 		ping :cualquier cosa rara
Debes contestar: 	pong :la misma cosa rara de ping

Ejemplo:
PING :746359702
pong :746359702

2.1. Paso a paso...

2.1.1. PASS <password>

Establecemos el password de conexion (ni idea de para que sirve)

Ejemplo:
pass debianrocks

2.1.2. NICK <nickname>

Escogemos el nick :)

Ejemplo:
nick zerocool

2.1.3. USER <user> <mode> <unused> <realname>

Ajustamos el 'user' para la mascara del usuario y el realname.
<mode> es una bitmask. Se usan 2:

bit	funcion	valor
2	+w	4
3	+i	8

Ejemplo:
user debian 8 * :Debian rlz a lot

(Esto nos haria debian@host, tendriamos modo +iw y "Debian rlz a lot" de 
realname. No se pq pero a veces lo del modo se lo pasa por el forro...)

*** A partir de aqui estariamos conectados, lo siguiente son sugerencias...

2.1.4. OPER <name> <password>

Nos haria opers :) Este paso nos lo debemos saltar si no tenemos Oline :[

Ejemplo:
oper tuxisuau killercop

2.1.5. MODE <nick> <modo>

Aqui ajustamos por fin el modo (user lo intenta pero no se sale mu fien :)

Ejemplo:
mode tuxisuau -x

2.2. Ejemplo de conexion

Para aclarar ideas un ejemplo REAL de conexion, eso si, nos jode la 
restriccion de las 80 columnas... supongo que sabreis leerlo :)

tux@debian:~$ telnet coruscant.irc-hispano.org 6667
Trying 195.76.22.2...
Connected to 195.76.22.2.
Escape character is '^]'.
*** El server nos dice:
:coruscant.irc-hispano.org NOTICE SOCKS4 :*** Checking WinGate/SocksProxy 
security...
:coruscant.irc-hispano.org NOTICE SOCKS4 :*** Proxy test passed.
*** Nosotros le decimos:
pass debianrocks
nick zerocool
*** El server nos dice:
:coruscant.irc-hispano.org 433 * zerocool :Nickname is already in use or 
registered (missing or wrong password)
*** Nosotros le decimos:
nick zerokul
*** El server nos dice:
PING :746359702
:NiCK!-@- NOTICE zerokul :*** Proteccin IP: tu direccin virtual es 
BqkrAe.BdJTSS.virtual
*** Nosotros le decimos:
pong :746359702
user debian 8 * :Debian rlz a lot
*** El server nos dice:
:coruscant.irc-hispano.org 001 zerokul :Welcome to the Internet Relay Network 
zerokul
:coruscant.irc-hispano.org 002 zerokul :Your host is 
coruscant.irc-hispano.org, running version u2.10.H.02.05
:coruscant.irc-hispano.org 003 zerokul :This server was created mar dic 5 2000 
at 10:23:26 CET
:coruscant.irc-hispano.org 004 zerokul coruscant.irc-hispano.org u2.10.H.02.05 
dioswkg biklmnopstv
:coruscant.irc-hispano.org 251 zerokul :There are 3361 users and 1836 
invisible on 47 servers
:coruscant.irc-hispano.org 252 zerokul 25 :operator(s) online
:coruscant.irc-hispano.org 254 zerokul 4832 :channels formed
:coruscant.irc-hispano.org 255 zerokul :I have 44 clients and 1 servers
:coruscant.irc-hispano.org NOTICE zerokul :Highest connection count: 871 (870 
clients)
:coruscant.irc-hispano.org 375 zerokul :- coruscant.irc-hispano.org Message of 
the Day - 
:coruscant.irc-hispano.org 372 zerokul :- 5/12/2000 10:23
:coruscant.irc-hispano.org 372 zerokul :- Bienvenido al IRC SERVER EUROCIBER
:coruscant.irc-hispano.org 372 zerokul :- Colabora y disfruta.
:coruscant.irc-hispano.org 376 zerokul :End of /MOTD command.
:coruscant.irc-hispano.org NOTICE zerokul :on 2 ca 1(2) ft 10(10)
:zerokul MODE zerokul :+x
:NiCK!-@- PRIVMSG zerokul :Este nick est registrado y protegido. Si es tu 
nick, escribe 12/msg NiCK@deep.space IDENTIFY contrasea. Si no lo es, escoge 
un nick diferente con el comando /nick 'otro nick' o bien consulta la pgina 
http://www.irc-hispano.org/ayuda/tutorial/nick-tut.html
*** Estamos conectados !!!

3. Chateando un poco

Aqui una pequenya muestra de como funciona una session de irc... es importante 
saber que los parametros se separan usando espacios y los comandos concluyen 
con un LF o CR. Algunos parametros nnecesitan contener espacios. Estos 
empiezan con dos puntos ":".

3.1. PRIVMSG <nickdestino> <texto>

Sirve para enviar msg's a nicks (query) o a canales (hablar normal)

Ejemplo:
PRIVMSG tuxisuau :hola!
*** Mi BitchX recibe el msg...
05:42AM [zerokul(nobody@BqkrAe.BdJTSS.virtual)] hola!
*** y ahora en un canal :)
PRIVMSG #root :soy la lite lite de las lites
*** Mi BitchX me dice...
06:06AM <zerokul> soy la lite lite de las lites
*** No se pq pero creo k me voy a ganar un ban...
PING :coruscant.irc-hispano.org
:PAC-MAC!~mun@AoBa2i.Dw3CdD.virtual PRIVMSG #root ::?
:PAC-MAC!~mun@AoBa2i.Dw3CdD.virtual PRIVMSG #root :que eres el que?
:PAC-MAC!~mun@AoBa2i.Dw3CdD.virtual PRIVMSG #root :x'DDD
PONG :coruscant.irc-hispano.org
PRIVMSG #root :soy la lite hax0r de la leet
*** x'D

3.2. NOTICE <nickdestino> <texto>

Sirve para enviar notices. La diferencia entre msg y notice es que el notice 
no genera o no deberia generar respuestas automaticas jamas.

Ejemplo:
NOTICE tuxisuau :debian!
*** Mi BitchX recibe el notice...
-zerokul(nobody@BqkrAe.BdJTSS.virtual)- debian!

3.3. JOIN ( <canal> [password] ) / "0"

Sirve para entrar a un canal. Si usamos un cero de parametro saldremos de 
todos los canales.

Ejemplo:
join #root
*** El server nos explica...
:zerokul!nobody@BqkrAe.BdJTSS.virtual JOIN :#root
:coruscant.irc-hispano.org 353 zerokul = #root :zerokul J0su4 Kiugni princc3sa 
mnm tuxisuau inv989511 NiH ICEFIRE harvenz @Anarion Nai^aZzZ PAC-MAC Skull_ 
r^_^NOTA @Ca|n 
:coruscant.irc-hispano.org 366 zerokul #root :End of /NAMES list.
:CHaN!-@- NOTICE zerokul :Canal de Administracin de Unix/linux. 
12http://croot.digicode.org1  Echa un vistazo tb a http://www.7a69ezine.org/ 
Realizada por varios miembros de #root. :-)
*** Mi BitchX le ve entrar...
-:- zerokul [nobody@BqkrAe.BdJTSS.virtual] has joined #root

3.4. PART <canal> <partmsg>

Sirve para salir de un canal o de varios si los separamos usando comas.

Ejemplo:
part #root :I'm the lite hax0r of the l33t   
*** El server nos dice...
:zerokul!nobody@BqkrAe.BdJTSS.virtual PART #root :I'm the lite hax0r of the 
l33t
*** Mi BitchX me cuenta...
-:- zerokul [nobody@BqkrAe.BdJTSS.virtual] has left #root [I'm the lite hax0r 
of the l33t]
*** Ha quedado muy leet XD

3.5. QUIT <quitmsg>

Lo usaremos para concluir nuestra session de irc :)

Ejemplo:

quit :7a69 r0cks www.7a69ezine.org
+++ En BitchX vemos...
-:- SignOff _7a69zine: #root (7a69 r0cks www.7a69ezine.org)

4. CTCP: Client 2 Client Protocol

El protocolo de cliente a cliente se usa para hacer peticiones/mandar datos al 
cliente IRC del destinatario. Por ejemplo, un VERSION ;)

4.1. Enviando CTCP's

Para mandar CTCP usaremos PRIVMSG. La pregunta es... Pero el PRIVMSG no servia 
para hablar en un canal/con una persona? Claro! Y entonces como distingue el 
cliente un ctcp de un mensaje normal?

Bien, para ello usaremos caracteres especiales, en contreto \001 (en el 
formato del printf del ANSI-C, simplemente es el caracter ASCII 1).

Ejemplo:

PRIVMSG tuxisuau :\001VERSION\001

Las respuestas se envian usando NOTICE:

NOTICE toyesperandorespuestadelversionkacabodehacer :\001VERSION TuxiIRC by 
tuxisuau:0.1.2:SuperLiteBSD 0.0.1\001

El tema del intercalado da bastante mas de si. Para mas info siempre puedes 
meter mano a los docs (RTFM).

4.2. Tipos de CTCP

Hay unos cuantos, los que listo a continuacion son los estandar, aunque hay 
que tener en cuenta que existen algunos clientes que usan sus propios ctcp's 
no estandar (sound, mp3, tonterias desas y quiza incluso haya algo util...)

4.2.1. CLIENTINFO

Devuelve una lista de lo que el cliente sabe

4.2.2. ERRMSG

Usado para contestar a errores

4.2.3. FINGER

Obsoleto, sirver para sacar algo de info sobre los usuarios.

4.2.4. USERINFO

Debe devolver una cadena escrita por el usuario (jamas debe ser fijada por el 
programador del cliente...)

4.2.5. VERSION

Devuelve la version del cliente en formato cliente:version:entorno

4.2.6. SOURCE

Devuelve info sobre como encontrar el cliente de IRC usado (la url de la web 
del cliente o la direccion de correo del programador, normalmente)

5. DCC: Conexiones directas entre clientes

Las conexiones DCC permiten a los usuarios mantener saltarse algunas 
limitaciones de los servidores de irc estableciendo conexion TCP directa entre 
si.

5.1. Tipos de DCC

Tenemos un par de estandar, luego los clientes pueden soportar tipos 
extraos...

5.1.1. CHAT

Sirve para entablar conversaciones semi-seguras entre clientes (y digo 
semi-seguras por que aun que no pasen por el servidor de irc, viajan en texto 
plano y se pueden sniffar... Si se quiere una conversa segura de verdad, hay 
que usar algun sistema de encriptacion decente...)

5.1.2. SEND

Sirve para transmitir ficheros de un cliente a otro.

5.2. Inicio de una conexion DCC

Para iniciar una conexion DCC, el cliente abre un socket y manda un CTCP al 
otro cliente indicandole que quiere iniciar una conexion DCC.

Para ello, usa el formato siguiente...

DCC tipo argumento direccion puerto

En el caso del DCC SEND, el argumento es el nombre del fichero.

La direccion se envia en forma de Integer.

Un ejemplo seria el siguiente...

PRIVMSG iokerounfile :\001DCC send linux_2.4.2.tar.bz2 2345234 21\001

Entonces el usuario deberia ser notificado del fichero entrante y este deberia 
de decidir si quiere recibirlo o no. Al aceptar un DCC el cliente procede a 
conectar directamente con la ip que se le ha facilitado, de manera que es 
obvio que los clientes JAMAS deberian autoaceptar conexiones DCC.

5.2.1. Pasando una IP a Integer

Es muy sencillo. Si IP es a.b.c.d, su valor en INT es:
(a * 256 * 256 * 256) + (b * 256 * 256) + (c * 256) + d

Para poner las cosas mas faciles, me he currado una cutrada-prog en C para 
pasar de ip a INT (ip2int.c)

El programa es una cutrada, si tienes ganas puedes modificarlo para que acepte 
ips separadas por puntos (si estas aprendiendo a programar, es un buen 
ejercicio...)

5.2.2. Debilidades de los DCC

Como veis al indicarle al cliente la ip a la que se debe conectar usando un 
CTCP, es facilisimo manipular este para indicarle al cliente que se conecte a 
la ip o al puerto que desee.
Por ejemplo, podemos enganyar a alguien para que acepte el dcc confiado y 
conecte a algun puerto comprometido de la maquina de un kiddie, de manera que 
el kiddie muy probablemente procedera a lanzar algun DoS contra el inocente 
(maravillas de la ing. social...) Eso es solo una idea. Imaginen tambien un 
cliente con autoget, que podria ser utilizado alobestia para barrer con 
conexiones TCP puertos/rangos para hacer pitar firewalls cutres, "firmar" 
logs, saturar maquinas, provocar a los kiddies, etc.
Algunos clientes aceptan como DCCs validos CTCP's DCC enviados hacia 
canales... si en esos canales hay algun o algunos clientes vulnerables (y no 
digo nada si encima tienen autoget) es posible provocar conexiones TCP en 
masa...
En fin, experimentad con esto tanto como querais pero yo no os he explicado 
esto para que lo useis para cosas malas, sino para todo lo contrario :P

6. Conclusion

IRC r0cks :)

Al ser un protocolo en texto plano nos podemos conectar "a lo bestia", y esto 
nos hace posible entrar desde practicamente cualquier trasto con conexion a 
internet. Yo entre el otro dia desde msdos (!), si teneis curiosidad, use el 
'kit' de conexion pa msdos incluido en arachne (lo encontre en freshmeat.net) 
y un paquete-expansion de telnet para msdos que descargue desde el arachne de 
su sitio oficial. Imagino que tb debe de rular en pcdos, drdos, opendos, 
freedos, etc. Lo tube que poner a 33.6 por eso, si no no marcaba :(

Espero que este articulo os sea util, al menos ahora entendereis un poco el 
protocolo IRC y si os animais podeis incluso programar alguna cosa.

Si os gusta el tema, os recomiendo leer (yo lo he usado como referencia...):

RFC 1459: Internet Relay Chat Protocol (el original)
RFC 1580: Guide to Network Resource Tools (recursos de la red en general)
RFC 2810: Internet Relay Chat: Architecture
RFC 2811: Internet Relay Chat: Channel Management
RFC 2812: Internet Relay Chat: Client Protocol
RFC 2813: Internet Relay Chat: Server Protocol

Los podeis encontrar en muchos lados, pero yo los saque de...
www.irc.org
www.rfc-editor.org

Espero volver pronto con mas y mejores articulos :-)

-=( EOF )=-
